ウィンドウシングルトンは非推奨になりました
まとめ
複数のビューと複数のウィンドウをサポートする準備として、window
シングルトンは非推奨になりました。以前に依存していたコードwindow
シングルトン
操作したい特定のビューを、View.of
API
または、PlatformDispatcher
直接。
コンテクスト
当初、Flutter はアプリケーションが単一のコンポーネントのみで構成されることを想定していました。
ビュー (window
) コンテンツを引き込むことができます。マルチビューの世界では、これは
仮定はもはや意味をなさず、この仮定をエンコードする API には
廃止されました。代わりに、これらの API に依存するアプリケーションとライブラリ
操作したい特定のビューを選択する必要があります。
この移行ガイドで説明されているように、新しいマルチビュー互換 API に移行してください。
変更内容の説明
この変更の一環として非推奨となった API は次のとおりです。
- グローバル
window
によって公開された財産dart:ui
。 - の
window
のプロパティBaseBinding
クラス、 通常は次の方法でアクセスします。-
GestureBinding.instance.window
、 -
SchedulerBinding.instance.window
、 -
ServicesBinding.instance.window
、 -
PaintingBinding.instance.window
、 -
SemanticsBinding.instance.window
、 -
RendererBinding.instance.window
、 -
WidgetsBinding.instance.window
、 また -
WidgetTester.binding.window
。
-
- の90cf395f-1c25-4ベッド-80ad-bd507a121399からのクラス
dart:ui
。 -
TestWindow
からflutter_test
、そのコンストラクター、 およびそのすべてのプロパティとメソッド。
依存するアプリケーションおよびライブラリ コードを移行するには、次のオプションがあります。 これらの非推奨の API については、次のとおりです。
もしBuildContext
が利用可能です。現在の情報を調べることを検討してください。FlutterView
経由View.of
。これにより返されるのは、FlutterView
の中へ
によって構築されたウィジェットbuild
指定されたコンテキストに関連付けられたメソッド
描かれます。のFlutterView
同じ機能へのアクセスを提供します
以前は非推奨になったバージョンで利用可能でしたSingletonFlutterView
クラス
非推奨によって返されるwindow
上記のプロパティ。ただし、一部の
プラットフォーム固有の機能は、PlatformDispatcher
、
からアクセスできますFlutterView
によって返されましたView.of
経由FlutterView.platformDispatcher
。使用するView.of
の好ましい方法です
上記の非推奨のプロパティから移行します。
いいえの場合BuildContext
を検索することができますFlutterView
、PlatformDispatcher
直接参照してプラットフォーム固有の情報にアクセスできます
機能性。また、利用可能なすべてのリストも維持しますFlutterView
にいるPlatformDispatcher.views
ビュー固有の機能にアクセスします。もし可能なら、
のPlatformDispatcher
バインディング経由でアクセスする必要があります (たとえば、WidgetsBinding.instance.platformDispatcher
) 静的を使用する代わりにPlatformDispatcher.instance
財産。これにより、機能が保証されます。
のPlatformDispatcher
テストで適切にモックアウトできます。
テスト
にアクセスしたテストの場合、WidgetTester.binding.window
変更するプロパティ
テスト用のウィンドウ プロパティでは、次の移行が利用可能です。
で書かれたテストではtestWidgets
、2 つの新しいプロパティが追加されました。
~の機能を一緒に置き換えるTestWindow
。
-
WidgetTester.view
を提供しますTestFlutterView
変更できるもの 同様にWidgetTester.binding.window
、ただしビュー固有のみ ビューのサイズ、表示ピクセル比などのプロパティ。-
WidgetTester.viewOf
特定のマルチビューのユースケースでは利用できますが、 からの移行には必要ありません。WidgetTester.binding.window
。
-
-
WidgetTester.platformDispatcher
へのアクセスを提供しますTestPlatformDispatcher
プラットフォーム固有の変更に使用できます プラットフォームのロケール、特定のシステム機能かどうかなどのプロパティ などが利用可能です。
移行ガイド
静的ファイルにアクセスする代わりに、window
プロパティ、アプリケーション、およびライブラリ コード
にアクセスできるBuildContext
使用する必要がありますView.of
調べるためにFlutterView
コンテキストが関連付けられています。一部の物件はこちらに移転しました
のPlatformDispatcher
ビューからアクセス可能platformDispatcher
ゲッター。
移行前のコード:
Widget build(BuildContext context) {
final double dpr = WidgetsBinding.instance.window.devicePixelRatio;
final Locale locale = WidgetsBinding.instance.window.locale;
return Text('The device pixel ratio is $pdr and the locale is $locale.');
}
移行後のコード:
Widget build(BuildContext context) {
final double dpr = View.of(context).devicePixelRatio;
final Locale locale = View.of(context).platformDispatcher.locale;
return Text('The device pixel ratio is $pdr and the locale is $locale.');
}
いいえの場合BuildContext
利用可能です。PlatformDispatcher
によって暴露された
バインディングを直接参照できます。
移行前のコード:
double getTextScaleFactor() {
return WidgetsBinding.instance.window.textScaleFactor;
}
移行後のコード:
double getTextScaleFactor() {
// View.of(context).platformDispatcher.textScaleFactor if a BuildContext is available, otherwise:
return WidgetsBinding.instance.platformDispatcher.textScaleFactor;
}
テスト
で書かれたテストではtestWidget
、 新しいview
とplatformDispatcher
代わりにアクセサを使用する必要があります。
ビュー固有のプロパティの設定
TestFlutterView
テスト API をより明確にするための努力も行っています。
代わりに、関連するゲッターと同じ名前のセッターを使用して簡潔にします。
セッターとTestValue
サフィックス。
移行前のコード:
testWidget('test name', (WidgetTester tester) async {
tester.binding.window.devicePixelRatioTestValue = 2.0;
tester.binding.window.displayFeaturesTestValue = <DisplayFeatures>[];
tester.binding.window.gestureSettingsTestValue = const GestureSettings(physicalTouchSlop: 100);
tester.binding.window.paddingTestValue = FakeViewPadding.zero;
tester.binding.window.physicalGeometryTestValue = const Rect.fromLTRB(0,0, 500, 800);
tester.binding.window.physicalSizeTestValue = const Size(300, 400);
tester.binding.window.systemGestureInsetsTestValue = FakeViewPadding.zero;
tester.binding.window.viewInsetsTestValue = FakeViewPadding.zero;
tester.binding.window.viewPaddingTestValue = FakeViewPadding.zero;
});
移行後のコード
testWidget('test name', (WidgetTester tester) async {
tester.view.devicePixelRatio = 2.0;
tester.view.displayFeatures = <DisplayFeatures>[];
tester.view.gestureSettings = const GestureSettings(physicalTouchSlop: 100);
tester.view.padding = FakeViewPadding.zero;
tester.view.physicalGeometry = const Rect.fromLTRB(0,0, 500, 800);
tester.view.physicalSize = const Size(300, 400);
tester.view.systemGestureInsets = FakeViewPadding.zero;
tester.view.viewInsets = FakeViewPadding.zero;
tester.view.viewPadding = FakeViewPadding.zero;
});
ビュー固有のプロパティのリセット
TestFlutterView
個々のプロパティまたは
全体像ですが、より明確かつ一貫性のあるものにするために、これらの名前を付けています。
からメソッドが変更されましたclear<property>TestValue
とclearAllTestValues
にreset<property>
とreset
それぞれ。
個々のプロパティのリセット
移行前のコード:
testWidget('test name', (WidgetTester tester) async {
addTearDown(tester.binding.window.clearDevicePixelRatioTestValue);
addTearDown(tester.binding.window.clearDisplayFeaturesTestValue);
addTearDown(tester.binding.window.clearGestureSettingsTestValue);
addTearDown(tester.binding.window.clearPaddingTestValue);
addTearDown(tester.binding.window.clearPhysicalGeometryTestValue);
addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
addTearDown(tester.binding.window.clearSystemGestureInsetsTestValue);
addTearDown(tester.binding.window.clearViewInsetsTestValue);
addTearDown(tester.binding.window.clearViewPaddingTestValue);
});
移行後のコード
testWidget('test name', (WidgetTester tester) async {
addTearDown(tester.view.resetDevicePixelRatio);
addTearDown(tester.view.resetDisplayFeatures);
addTearDown(tester.view.resetGestureSettings);
addTearDown(tester.view.resetPadding);
addTearDown(tester.view.resetPhysicalGeometry);
addTearDown(tester.view.resetPhysicalSize);
addTearDown(tester.view.resetSystemGestureInsets);
addTearDown(tester.view.resetViewInsets);
addTearDown(tester.view.resetViewPadding);
});
すべてのプロパティを一度にリセットする
移行前のコード:
testWidget('test name', (WidgetTester tester) async {
addTearDown(tester.binding.window.clearAllTestValues);
});
移行後のコード
testWidget('test name', (WidgetTester tester) async {
addTearDown(tester.view.reset);
});
プラットフォーム固有のプロパティの設定
TestPlatformDispatcher
同じ機能と命名スキームを保持します。
テストセッターもそうでしたTestWindow
したがって、プラットフォーム固有のプロパティの移行
主に、新しいセッターで同じセッターを呼び出すことで構成されます。WidgetTester.platformDispatcher
アクセサ。
移行前のコード:
testWidgets('test name', (WidgetTester tester) async {
tester.binding.window.accessibilityFeaturesTestValue = FakeAccessibilityFeatures.allOn;
tester.binding.window.alwaysUse24HourFormatTestValue = false;
tester.binding.window.brieflyShowPasswordTestValue = true;
tester.binding.window.defaultRouteNameTestValue = '/test';
tester.binding.window.initialLifecycleStateTestValue = 'painting';
tester.binding.window.localesTestValue = <Locale>[const Locale('en-us'), const Locale('ar-jo')];
tester.binding.window.localeTestValue = const Locale('ar-jo');
tester.binding.window.nativeSpellCheckServiceDefinedTestValue = false;
tester.binding.window.platformBrightnessTestValue = Brightness.dark;
tester.binding.window.semanticsEnabledTestValue = true;
tester.binding.window.textScaleFactorTestValue = 2.0;
});
移行後のコード:
testWidgets('test name', (WidgetTester tester) async {
tester.platformDispatcher.accessibilityFeaturesTestValue = FakeAccessibilityFeatures.allOn;
tester.platformDispatcher.alwaysUse24HourFormatTestValue = false;
tester.platformDispatcher.brieflyShowPasswordTestValue = true;
tester.platformDispatcher.defaultRouteNameTestValue = '/test';
tester.platformDispatcher.initialLifecycleStateTestValue = 'painting';
tester.platformDispatcher.localesTestValue = <Locale>[const Locale('en-us'), const Locale('ar-jo')];
tester.platformDispatcher.localeTestValue = const Locale('ar-jo');
tester.platformDispatcher.nativeSpellCheckServiceDefinedTestValue = false;
tester.platformDispatcher.platformBrightnessTestValue = Brightness.dark;
tester.platformDispatcher.semanticsEnabledTestValue = true;
tester.platformDispatcher.textScaleFactorTestValue = 2.0;
});
プラットフォーム固有のプロパティのリセット
プロパティの設定と同様に、プラットフォーム固有のプロパティのリセットは次のようになります。
主に、からの変更binding.window
へのアクセサplatformDispatcher
アクセサ。
個々のプロパティのリセット
移行前のコード:
testWidgets('test name', (WidgetTester tester) async {
addTeardown(tester.binding.window.clearAccessibilityFeaturesTestValue);
addTeardown(tester.binding.window.clearAlwaysUse24HourFormatTestValue);
addTeardown(tester.binding.window.clearBrieflyShowPasswordTestValue);
addTeardown(tester.binding.window.clearDefaultRouteNameTestValue);
addTeardown(tester.binding.window.clearInitialLifecycleStateTestValue);
addTeardown(tester.binding.window.clearLocalesTestValue);
addTeardown(tester.binding.window.clearLocaleTestValue);
addTeardown(tester.binding.window.clearNativeSpellCheckServiceDefinedTestValue);
addTeardown(tester.binding.window.clearPlatformBrightnessTestValue);
addTeardown(tester.binding.window.clearSemanticsEnabledTestValue);
addTeardown(tester.binding.window.clearTextScaleFactorTestValue);
});
移行後のコード:
testWidgets('test name', (WidgetTester tester) async {
addTeardown(tester.platformDispatcher.clearAccessibilityFeaturesTestValue);
addTeardown(tester.platformDispatcher.clearAlwaysUse24HourFormatTestValue);
addTeardown(tester.platformDispatcher.clearBrieflyShowPasswordTestValue);
addTeardown(tester.platformDispatcher.clearDefaultRouteNameTestValue);
addTeardown(tester.platformDispatcher.clearInitialLifecycleStateTestValue);
addTeardown(tester.platformDispatcher.clearLocalesTestValue);
addTeardown(tester.platformDispatcher.clearLocaleTestValue);
addTeardown(tester.platformDispatcher.clearNativeSpellCheckServiceDefinedTestValue);
addTeardown(tester.platformDispatcher.clearPlatformBrightnessTestValue);
addTeardown(tester.platformDispatcher.clearSemanticsEnabledTestValue);
addTeardown(tester.platformDispatcher.clearTextScaleFactorTestValue);
});
すべてのプロパティを一度にリセットする
移行前のコード:
testWidgets('test name', (WidgetTester tester) async {
addTeardown(tester.binding.window.clearAllTestValues);
});
移行後のコード:
testWidgets('test name', (WidgetTester tester) async {
addTeardown(tester.platformDispatcher.clearAllTestValues);
});
タイムライン
リリースされたバージョン: 3.9.0-13.0.pre.20
安定リリース: 3.10.0
参考文献
API ドキュメント:
View.of
FlutterView
PlatformDispatcher
TestPlatformDispatcher
TestFlutterView
TestWidgetsFlutterBinding.window
関連する問題:
- 問題 116929
- 問題 117481
- 問題 121915
関連する PR:
- SingletonFlutterWindow とグローバル ウィンドウ シングルトンを非推奨にする
- BindingBase.window を非推奨にする
- 廃止予定
TestWindow